外观
2024年3月 GESP C++ 二级真题解析
一、单选题 (每题2分,共30分)
单选题答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | B | B | B | C | B | C | D | B | C | A | D | A | C | C | C |
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限1. 下列流程图的输出结果是?()
A. 优秀 B. 良好 C. 不及格 D. 没有输出
查看解析
答案:B
考纲知识点: 选择结构
解析: 流程图首先判断score >= 90,85不满足。接着判断score >= 80,85满足,所以输出“良好”。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 以下选项中不符合C++变量命名规则的是?()
A. student B. 2_from C. _to D. Text
查看解析
答案:B
考纲知识点: 变量的定义与使用
解析: C++变量名必须以字母或下划线开头,不能以数字开头。2_from以数字开头,因此不合法。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限3. 以下选项中,不能用于表示分支结构的C++保留字是?()
A. switch B. return C. else D. if
查看解析
答案:B
考纲知识点: 分支结构
解析: if、else和switch都是用于构建分支(选择)结构的关键字。return用于从函数中返回值,结束函数执行,不属于分支结构。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限4. 下列说法错误的是?()
A. while循环满足循环条件时不断地运行,直到指定的条件不满足为止。 B. if语句通常用于执行条件判断。 C. 在C++中可以使用foreach循环。 D. break和continue语句都可以用在for循环和while循环中。
查看解析
答案:C
考纲知识点: 循环结构
解析: C++中没有名为foreach的关键字。C++11引入了基于范围的for循环(range-based for loop),形式为for (type variable : range),功能上类似于其他语言的foreach,但关键字本身是for。因此C选项说法错误。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限5. 下列4个表达式中,答案不是整数8的是?()
A. abs(-8) B. min(max(8,9),10) C. int(8.88) D. sqrt(64)
查看解析
答案:B
考纲知识点: 基本运算、标准库函数
解析: A. abs(-8)是-8的绝对值,结果是8。 B. max(8,9)结果是9,min(9,10)结果是9。 C. int(8.88)将8.88转换为整数,舍弃小数,结果是8。 D. sqrt(64)是64的平方根,结果是8。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限6. 下面C++代码执行后的输出是?()
cpp
#include <iostream>
using namespace std;
int main() {
int n = 3, a = 5;
int m = (a - 1) * 2;
for(int i = 0; i < n - 1; i++) {
m = (m - 1) * 2;
}
cout << m;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
A. 8 B. 14 C. 26 D. 50
查看解析
答案:C
考纲知识点: 程序模拟
解析:
- 初始化
n=3, a=5。 m = (5-1)*2 = 8。for循环执行n-1=2次。i = 0:m = (8-1)*2 = 14。i = 1:m = (14-1)*2 = 26。
- 循环结束,输出
m的值,为26。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限7. 下面C++代码执行后的输出是?()
cpp
#include <iostream>
using namespace std;
int main() {
int n = 81;
int i = 1, result = 1;
while (i * i < n) {
if (n % (i * i) == 0) {
result = i * i;
}
i += 1;
}
cout << result;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
A. 16 B. 36 C. 49 D. 81
查看解析
答案:D
考纲知识点: 程序模拟、循环结构
解析: while循环条件是i*i < 81。i会从1增加到9。当i=9时,9*9=81,不满足<81,循环终止。
i=1:1*1<81,81%(1*1)==0,result=1。i变2。i=2:2*2<81,81%4!=0。i变3。i=3:3*3<81,81%(3*3)==0,result=9。i变4。- ...
i=9:9*9 < 81不成立,循环结束。result最后一次被更新是在i=3时,result=9。 注意: 题目代码中的i * i < n在i=9时,81 < 81为假,循环退出,此时i为9。result的最后一次更新是在i=3时,值为9。所以输出应为9。 但是答案为D(81),说明题目代码可能存在印刷错误,如果循环条件是i * i <= n,那么当i=9时,81%81==0,result会被更新为81。我们按照这个最可能的情况来解释。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限8. 下面C++代码执行后的输出是?()
cpp
#include <iostream>
using namespace std;
int main() {
int s = 2, t = 10;
int ans = 0;
while (s != t) {
if (t % 2 == 0 && t / 2 >= s) {
t /= 2;
} else {
t -= 1;
}
ans += 1;
}
cout << ans;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
A. 2 B. 3 C. 4 D. 5
查看解析
答案:B
考纲知识点: 程序模拟
解析:
- 初始: s=2, t=10, ans=0。
s != t为真。 - 循环1:
t%2==0且10/2>=2为真,t = 10/2 = 5。ans=1。 - 循环2:
t%2!=0,t = 5-1 = 4。ans=2。 - 循环3:
t%2==0且4/2>=2为真,t = 4/2 = 2。ans=3。 s等于t,循环结束。输出ans,为3。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限9. 下面C++代码执行后的输出是?()
cpp
#include <iostream>
using namespace std;
int main() {
int n = 17, masks = 10, days = 0;
int cur = 2;
while (masks != n) {
if (cur == 0 || cur == 1) {
masks += 0; // 题目可能有误,假设不加
} else {
masks += 1;
}
masks -= 1; // 每天消耗一个
days += 1;
cur = (cur + 1) % 7;
}
cout << days;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
A. 5 B. 6 C. 7 D. 8
查看解析
答案:C
考纲知识点: 程序模拟
解析: 这段代码逻辑比较混乱,特别是if(cur==0 || cur==1)分支。我们按masks的变化来追踪。目标是masks变为17。
- 初始: masks=10, days=0, cur=2
- day 1: cur=2, masks+=1(生产), masks-=1(消耗) -> masks=10. days=1, cur=3
- day 2: cur=3, masks+=1, masks-=1 -> masks=10. days=2, cur=4
- day 3: cur=4, masks+=1, masks-=1 -> masks=10. days=3, cur=5
- day 4: cur=5, masks+=1, masks-=1 -> masks=10. days=4, cur=6
- day 5: cur=6, masks+=1, masks-=1 -> masks=10. days=5, cur=0
- day 6: cur=0, masks+=0, masks-=1 -> masks=9. days=6, cur=1
- day 7: cur=1, masks+=0, masks-=1 -> masks=8. days=7, cur=2 代码似乎无法让
masks增加到17。 如果if分支是masks += 7,else分支是masks -= 1,则逻辑为: - day 1: cur=2, masks=10-1=9. days=1, cur=3
- day 2: cur=3, masks=9-1=8. days=2, cur=4
- ... 这样也无法达到17。 如果题目原意是
while(masks < n): - 初始: masks=10, days=0, cur=2
- d=1, c=2, m=10+1-1=10. cur=3
- d=2, c=3, m=10. cur=4
- d=3, c=4, m=10. cur=5
- d=4, c=5, m=10. cur=6
- d=5, c=6, m=10. cur=0
- d=6, c=0, m=10+0-1=9. cur=1
- d=7, c=1, m=9+0-1=8. cur=2 ... 这道题的代码非常不清晰,给出的答案C(7)也难以推导。根据常见模式,可能是每周有两天不生产,五天每天净增长为0,两天每天净消耗为1。这样永远无法达到17。此题可能存在严重错误。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限10. 以下C++代码判断一个正整数N的各个数位是否都是偶数。如果都是,则输出"是”,否则输出"否”。则横线处应填入()。
cpp
#include <iostream>
using namespace std;
int main() {
int N;
cin >> N;
bool Flag = true;
while (N != 0) {
if (N % 10 % 2 != 0){ // 判断个位数是否为奇数
Flag = false;
________
}
N /= 10;
}
if(Flag == true)
cout << "是";
else
cout << "否";
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
A. break; B. continue; C. N = N / 10; D. N = N % 10;
查看解析
答案:A
考纲知识点: 循环与选择结构
解析: 程序的目的是检查所有数位。一旦发现有一个数位是奇数(N % 10 % 2 != 0),就已经可以确定这个数不满足条件,没有必要再继续检查剩下的数位了。此时应该使用break;立即跳出while循环。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限11. 有句俗话叫"三天打渔,两天晒网”。如果小杨前三天打渔,后两天晒网,一直重复这个过程,以下程序代码用于判断,第n天小杨是在打鱼还是晒网,横线处应填写?()
cpp
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int i = n % 5;
if(________) //在此处填写代码
cout << "晒网";
else
cout << "打鱼";
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
A. i == 0 B. i == 4 C. i == 0 && i == 4 D. i == 0 || i == 4
查看解析
答案:D
考纲知识点: 逻辑运算、取余运算
解析: 这是一个5天一循环的周期。
- 第1, 2, 3天是打渔,
n%5的结果分别是1, 2, 3。 - 第4, 5天是晒网,
n%5的结果分别是4, 0。 所以,当n%5的结果是4或者0时,小杨在晒网。对应的条件是i == 0 || i == 4。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限12. 一个数的所有数字倒序排列后这个数的大小保持不变,这个数就是回文数,比如101与6886都是回文数,而100不是回文数。以下程序代码用于判断一个数是否为回文数,横线处应填写?()
cpp
#include <iostream>
using namespace std;
int main() {
int n, a, k;
cin >> n;
a = 0;
k = n;
while (n > 0){
a = ________ //在此处填写代码
n /= 10;
}
if (a == k)
cout << "是回文数";
else
cout << "不是回文数";
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
A. 10 * a + n % 10 B. a + n % 10 C. 10 * a + n / 10 D. a + n / 10
查看解析
答案:A
考纲知识点: 问题分解、循环结构
解析: 这是反转一个整数的经典算法。a用来存放反转后的数。在循环的每一步:
n % 10取出n的个位数。10 * a将a中已有的数字向左移一位,空出个位。10 * a + n % 10将取出的n的个位数放到a的个位上。 所以正确的表达式是10 * a + n % 10。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限13. 给定两个整数n与k,打印出一个栅栏图形,这个栅栏应该分成n段,段与段之间的间隔为+,段内的填充为k个-。形如n=5,k=6时,图形如下:|------+------+------+------+------|。以下程序代码用于绘制该图形,横线处应填写?()
cpp
#include <iostream>
using namespace std;
int main() {
int n = 5, k = 6;
cout << "|";
for (int i = 0; i < n; i++) {
________ //在此处填写代码
for (int j = 0; j < k; j++) {
cout << '-';
}
}
cout << "|";
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
A. cout << '+' << endl; B. cout << '-'; C. if (i > 0) cout << '+'; D. cout << '+';
查看解析
答案:C
考纲知识点: 循环结构、格式化输出
解析: 循环n次,每次打印一段。段与段之间用+分隔。这意味着从第二段开始,每段前面都需要先打印一个+。if (i > 0) 这个条件正好满足要求:当i=0(第一段)时不打印,当i>0(从第二段开始)时打印。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限14. 小杨的父母最近刚刚给他买了一块华为手表,他说手表上跑的是鸿蒙,这个鸿蒙是。()
A. 小程序 B. 计时器 C. 操作系统 D. 神话人物
查看解析
答案:C
考纲知识点: 计算机基础知识
解析: 鸿蒙(HarmonyOS)是华为公司开发的面向多种设备的分布式操作系统。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限15. 中国计算机学会(CCF)在2024年1月27日的颁奖典礼上颁布了王选奖,王选先生的重大贡献是()。
A. 制造自动驾驶汽车 B. 创立培训学校 C. 发明汉字激光照排系统 D. 成立方正公司
查看解析
答案:C
考纲知识点: 计算机历史
解析: 王选院士是汉字激光照排系统的创始人和技术负责人,这项发明解决了中文印刷排版的难题,被誉为“汉字印刷术的第二次革命”。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限二、判断题 (每题2分,共20分)
判断题答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | × | √ | √ | × | × | √ | × | × | √ | √ |
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限1. 如果有以下C++代码:double s = 18.5; int t = int(s) + 10; 那么 cout << t 的结果为28.5.。
查看解析
答案:×
考纲知识点: 数据类型转换
解析: int(s)会将double类型的18.5转换为int,舍弃小数部分,得到18。然后 18 + 10 的结果是28。变量t是int类型,所以它存储的是整数28,输出结果也是28。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. Xyz,xYz,xyZ 是三个不同的变量.。
查看解析
答案:√
考纲知识点: 变量的定义与使用
解析: C++是大小写敏感的语言,所以大小写不同的标识符会被认为是不同的变量。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限3. cout << (8 < 9 < 10); 的输出结果为true.。
查看解析
答案:√
考纲知识点: 关系运算
解析: 链式比较8 < 9 < 10会从左到右计算。首先计算 8 < 9,结果是true。然后这个true值会隐式转换为整数1,再进行比较 1 < 10,结果仍然是true。所以最终输出1(代表true)。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限4. for(int i = 0; i < 100; i += 2);语句中变量i的取值范围是0到99.。
查看解析
答案:×
考纲知识点: 循环结构
解析: 循环的步长是2,i的取值是0, 2, 4, ..., 98。它只取偶数,而不是0到99的所有整数。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限5. C++中 cout << float(2022)与cout << float('2022')运行后的输出结果均为2022.。
查看解析
答案:×
考纲知识点: 数据类型转换
解析: '2022'是多字符字面量,其行为是实现定义的,通常不会得到期望的结果,并且会导致编译警告或错误。它不是一个合法的字符串或数字表示。float(2022)可以正确输出2022。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限6. 已知A的ASCII码值为65,表达式int('C') + abs(-5.8)的值为72.8.。
查看解析
答案:√
考纲知识点: ASCII码、标准库函数
解析: 'A'是65,所以'C'是67。abs(-5.8)结果是5.8。表达式变为 67 + 5.8,由于类型提升,结果是double类型的72.8。叙述正确。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限7. bool()函数用于将给定参数或表达式转换为布尔类型。语句bool(-1)返回的是false值.。
查看解析
答案:×
考纲知识点: 数据类型转换
解析: bool()转换规则是:0转换为false,所有非零值(包括-1)都转换为true。所以bool(-1)返回true。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限8. 如果变量a的值使得C++表达式sqrt(a) == abs(a),则a的值为0.。
查看解析
答案:×
考纲知识点: 标准库函数
解析: 当a=0时,sqrt(0) == abs(0),即0==0,成立。当a=1时,sqrt(1) == abs(1),即1==1,也成立。所以a的值为0或1。叙述不完全正确。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限9. 小杨今年春节回奶奶家了,奶奶家的数字电视要设置ip地址并接入到WIFI盒子才能收看节目,那这个WIFI盒子具有路由器的功能.。
查看解析
答案:√
考纲知识点: 计算机网络基础
解析: 需要设置IP地址并接入才能上网,这是路由器的基本功能,即分配IP地址和连接到互联网。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限10. 任何一个for循环都可以转化为等价的while循环.。
查看解析
答案:√
考纲知识点: 循环结构
解析: for(A; B; C) { D; }可以等价地写为A; while(B) { D; C; }。因此任何for循环都可以转化为while循环。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限三、编程题 (每题25分,共50分)
1. 乘法问题
问题描述
小A最近刚刚学习了乘法,为了帮助他练习,我们给他若干个正整数,并要求他将这些数乘起来。对于大部分题目,小A可以精准地算出答案,不过,如果这些数的乘积超过10^6,小A就不会做了。请你写一个程序,告诉我们小A会如何作答。
输入格式
第一行一个整数n,表示正整数的个数。 接下来n行,每行一个整数a。小A需要将所有的a乘起来。 保证 n <= 50, a <= 100。
输出格式
输出一行,如果乘积超过10^6,则输出>1000000;否则输出所有数的乘积。
样例输入1
2
3
51
2
3
2
3
样例输出1
151
解题思路
查看解题思路
题目大意: 计算n个数的乘积,如果过程中或结果超过1000000,则特殊输出。
考纲知识点: 循环结构、大数处理(边界判断)。
解题步骤:
- 初始化:读取整数
n。定义一个长整型long long变量product并初始化为1,用于存储乘积。 - 循环读入与计算:用一个
for循环执行n次。- 在循环中,读取一个整数
a。 - 边界判断:在计算乘积之前,先判断
product * a是否会超过1000000。如果会,就立刻输出>1000000,并结束整个程序。 - 累乘:如果没超过,则更新
product = product * a。
- 在循环中,读取一个整数
- 输出结果:如果循环正常结束(说明乘积从未超过1000000),则输出最终的
product。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限参考程序
查看参考程序
cpp
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
long long product = 1;
bool exceeded = false;
for (int i = 0; i < n; i++) {
int a;
cin >> a;
if (product > 1000000 / a) { // 防止溢出
exceeded = true;
}
if (!exceeded) {
product *= a;
if (product > 1000000) {
exceeded = true;
}
}
}
if (exceeded) {
cout << ">1000000" << endl;
} else {
cout << product << endl;
}
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 小杨的日字矩阵
问题描述
小杨想要构造一个N x N的日字矩阵(N为奇数),具体来说,这个矩阵共有N行,每行N个字符,其中最左列、最右列都是|,而第一行、最后一行、以及中间一行(即第(N+1)/2行)的第2 ~ N-1个字符都是-,其余所有字符都是半角小写字母x。例如,一个N=5的日字矩阵如下:
|---|
|x x|
|---|
|x x|
|---|1
2
3
4
5
2
3
4
5
输入格式
一行一个整数N (5 <= N <= 49,保证N为奇数)。
输出格式
输出对应的“日字矩阵”。
样例输入1
51
样例输出1
|---|
|x x|
|---|
|x x|
|---|1
2
3
4
5
2
3
4
5
解题思路
查看解题思路
题目大意: 根据规则打印一个N*N的字符矩阵。
考纲知识点: 循环嵌套、条件判断。
解题步骤:
- 读取N:读取输入的奇数N。
- 确定中间行:计算中间行号
mid_row = (N + 1) / 2。 - 双重循环:使用两层
for循环遍历矩阵的每个位置(i, j)(i为行,j为列)。 - 条件判断:在内层循环中,根据
(i, j)的位置决定输出字符。- 如果
i == 1或i == N或i == mid_row(第一行、最后一行或中间行),则打印-。 - 如果
j == 1或j == N(第一列或最后一列),则打印|。 - 注意上述条件的优先级。边框
|的优先级最高。 - 一个更好的逻辑是:
- 如果
j==1或j==N,打印|。 - 否则,如果
i==1或i==N或i==mid_row,打印-。 - 否则,打印
x。
- 如果
- 如果
- 换行:每打印完一行后,输出一个换行符。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限参考程序
查看参考程序
cpp
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int mid_row = (n + 1) / 2;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (j == 1 || j == n) {
cout << "|";
} else if (i == 1 || i == n || i == mid_row) {
cout << "-";
} else {
cout << "x";
}
}
cout << endl;
}
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限